# 1.你的自定义存储系统必须是以下子类 django.core.files.storage.Storage
from django.core.files.storage import Storage
from fdfs_client.client import Fdfs_client
from django.utils.deconstruct import deconstructible
from django.conf import settings

# 你的存储类必须是可以解构的，以便在迁移中的字段上使用时可以对其进行序列化
# 只要字段具有可自行序列化的参数 就可以使用
# django.utils.deconstruct.deconstructible 类装饰器

@deconstructible()
class MyStorage(Storage):
    # 2.django必须能够在没有任何参数的情况下实例化存储系统
    # 这意味着任何设置都应该来自django。conf。sett

    def __init__(self,path=None,ip=None):
        if not path:
            path = settings.FDFS.CLIENT_CONF
            self.path = path

        if not ip:
            ip = settings.FDFS_URL
            self.ip = ip

    # 3.存储类必须实现_open() 和_save() 方法以及适用于存储类的任何其他方法


    def _open(self,name,mode='rb'):
        pass

    # save 保存
    # 实现保存方法 ，将图片通过Fdfs 保存 Storage 中
    def _save(self,name,content,max_length=None):


        # 1.创建client
        # client = Fdfs_client('utils/fadtdfs/client.conf')
        # client = Fdfs_client(setting.FDFS_CLIENT_CONF)
        client = Fdfs_client(self.path)

        # 2.获取图片
        #　save参数中
        # 表示图片的名字　不是路径
        # content 内容  二进制内容
        data = content.read()

        # 3.上传
        # buffer 上传二进制
        result = client.upload_by_buffer(data)

        # 4.判断上传的状态 并获取 file_id
        if result.get('Status') == 'Upload successed':
            file_id = result.get('Remote file_id')
        else:
            raise Exception('上传失败')

        # 5.需要把 file_id 返回就可以
        return file_id

    # 还有2个方法
    # 是否存在 exists
    # 不会出现图片覆盖的情况 直接返回false
    def exists(self, name):
        return False

    def url(self,name):

        return self.ip + name


